package com.jprocms.module.cms.service.channel;

import com.baomidou.mybatisplus.extension.service.IService;
import com.jprocms.module.cms.api.vo.BpmDeployReqVO;
import com.jprocms.module.cms.controller.admin.channel.dto.ChannelBatchCreateDto;
import com.jprocms.module.cms.controller.admin.channel.dto.ChannelRuleDto;
import com.jprocms.module.cms.controller.admin.channel.vo.*;
import com.jprocms.module.cms.dal.dataobject.channel.ChannelDO;
import com.jprocms.module.cms.mq.message.bpm.BpmDeployMessage;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;

/**
 * 栏目 Service 接口
 *
 * @author jprocms
 */
public interface ChannelService extends IService<ChannelDO> {

    /**
     * 创建栏目
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createChannel(@Valid ChannelCreateReqVO createReqVO);

    /**
     * 更新栏目
     *
     * @param updateReqVO 更新信息
     */
    void updateChannel(@Valid ChannelUpdateReqVO updateReqVO);

    /**
     * 更新栏目采集规则
     *
     * @param ruleDto 更新信息
     */
    void updateChannelRule(@Valid ChannelRuleDto ruleDto);


    /**
     * 彻底删除栏目
     *
     * @param id 编号
     */
    void deleteChannel(Long id) throws Exception;

    /**
     * 删除栏目到回收站
     *
     * @param id 编号
     */
    void recycleChannel(Long id);


    /**
     * 还原栏目
     *
     * @param id 编号
     */
    void restoreChannel(Long id);

    /**
     * 更新栏目工作流流程定义ID
     *
     * @param bpmDeployMessage 更新信息
     */
    void updateChannelWorkflowDefinitionId(BpmDeployReqVO bpmDeployMessage);

    /**
     * 获得栏目
     *
     * @param id 编号
     * @return 栏目
     */
    ChannelDO getChannel(Long id);

    /**
     * 获得栏目列表
     *
     * @param ids 编号
     * @return 栏目列表
     */
    List<ChannelDO> getChannelList(Collection<Long> ids);

    /**
     * 获得栏目列表
     *
     * @param listReqVO 查询条件
     * @return 栏目列表
     */
    List<ChannelDO> getChannelList(ChannelListReqVO listReqVO);

    /**
     * 获得栏目列表
     *
     * @param listReqVO 查询条件
     * @return 栏目列表
     */
    List<ChannelDO> getChannelListForFront(ChannelListReqVO listReqVO);

    /**
     * 获得不允许检索的栏目列表
     *
     * @param siteId 站点id
     * @return 栏目列表
     */
    List<ChannelDO> getNotAllowSearchChannelList(Long siteId);

    /**
     * 获得栏目 下拉选择列表 不加权限过滤
     *
     * @param listReqVO 查询条件
     * @return 栏目列表
     */
    List<ChannelDO> getChannelOptions(ChannelSimpleReqVO listReqVO);

    /**
     * 获得栏目列表 返回vo
     *
     * @param listReqVO 查询条件
     * @return 栏目列表
     */
    List<ChannelListRespVO> getChannelsTreeVo(ChannelListReqVO listReqVO);

    /**
     * 获得栏目统计列表 返回vo
     *
     * @param listReqVO 查询条件
     * @return 栏目列表
     */
    List<ChannelViewListRespVO> getChannelsViewListVo(ChannelListReqVO listReqVO);

    /**
     * 获得内容管理的栏目列表 返回vo
     *
     * @param listReqVO 查询条件
     * @return 栏目列表
     */
    List<ChannelListRespVO> getContentChannelsTreeVo(ContentChannelListReqVO listReqVO);

    /**
     * 查询叶子栏目
     *
     * @param channelId 栏目ID
     * @param path      栏目路径
     * @return
     */
    List<ChannelDO> selectLeafChannels(Long channelId, String path);

    /**
     * 查询叶子栏目集合
     *
     * @param channelIds 栏目ID
     * @param path       栏目路径
     * @return
     */
    List<ChannelDO> selectLeafChannels(Collection<Long> channelIds);

    /**
     * 根据栏目路径查询
     *
     * @param paths  栏目路径
     * @param siteId 站点ID
     * @return
     */
    List<ChannelDO> selectByChannelPath(Collection<String> paths, Long siteId);

    /**
     * 根据栏目路径查询
     *
     * @param path   栏目路径
     * @param siteId 站点ID
     * @return
     */
    ChannelDO selectByChannelPath(String path, Long siteId);

    /**
     * 批量创建栏目
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    List<Long> batchCreateChannel(@Valid ChannelBatchCreateVO createReqVO);
    /**
     * 复制栏目
     *
     * @param siteId 复制的站点
     * @return newSiteId 新创建的站点id
     */
    Boolean copyChannels(Long siteId, Long newSiteId);

    /**
     * 复制栏目和内容
     *
     * @param siteId 复制的站点
     * @return newSiteId 新创建的站点id
     */
    Boolean copyChannelsAndContents(Long siteId, Long newSiteId);


}
